EC-CUBE 2.11.4
[ class tree: EC-CUBE 2.11.4 ] [ index: EC-CUBE 2.11.4 ] [ all elements ]

Source for file SC_Product.php

Documentation is available at SC_Product.php

  1. <?php
  2. /*
  3.  * This file is part of EC-CUBE
  4.  *
  5.  * Copyright(c) 2000-2011 LOCKON CO.,LTD. All Rights Reserved.
  6.  *
  7.  * http://www.lockon.co.jp/
  8.  *
  9.  * This program is free software; you can redistribute it and/or
  10.  * modify it under the terms of the GNU General Public License
  11.  * as published by the Free Software Foundation; either version 2
  12.  * of the License, or (at your option) any later version.
  13.  *
  14.  * This program is distributed in the hope that it will be useful,
  15.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  16.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  17.  * GNU General Public License for more details.
  18.  *
  19.  * You should have received a copy of the GNU General Public License
  20.  * along with this program; if not, write to the Free Software
  21.  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
  22.  */
  23.  
  24. /**
  25.  * 商品を扱うサービスクラス.
  26.  *
  27.  * @author LOCKON CO.,LTD.
  28.  * @author Kentaro Ohkouchi
  29.  * @version $Id: SC_Product.php 21263 2011-09-28 07:15:05Z nanasess $
  30.  */
  31. class SC_Product {
  32.  
  33.     /** 規格名一覧 */
  34.     var $arrClassName;
  35.     /** 規格分類名一覧 */
  36.     var $arrClassCatName;
  37.     var $classCategories = array();
  38.     var $stock_find;
  39.     /** 規格1クラス名 */
  40.     var $className1 = '';
  41.     /** 規格2クラス名 */
  42.     var $className2 = '';
  43.     /** 規格1が設定されている */
  44.     var $classCat1_find;
  45.     /** 規格2が設定されている */
  46.     var $classCat2_find;
  47.     var $classCats1;
  48.     /** 検索用並び替え条件配列 */
  49.     var $arrOrderData;
  50.  
  51.     /**
  52.      * 商品検索結果の並び順を指定する。
  53.      *
  54.      * ただし指定できるテーブルはproduct_idを持っているテーブルであることが必要.
  55.      *
  56.      * @param string $col 並び替えの基準とするフィールド
  57.      * @param string $table 並び替えの基準とするフィールドがあるテーブル
  58.      * @param string $order 並び替えの順序 ASC / DESC
  59.      * @return void 
  60.      */
  61.     function setProductsOrder($col, $table = 'dtb_products', $order = 'ASC') {
  62.         $this->arrOrderData = array('col' => $col, 'table' => $table, 'order' => $order);
  63.     }
  64.  
  65.     /**
  66.      * SC_Queryインスタンスに設定された検索条件を元に並び替え済みの検索結果商品IDの配列を取得する。
  67.      *
  68.      * 検索条件は, SC_Query::setWhere() 関数で設定しておく必要があります.
  69.      *
  70.      * @param SC_Query $objQuery SC_Query インスタンス
  71.      * @param array $arrVal 検索パラメーターの配列
  72.      * @return array 商品IDの配列
  73.      */
  74.     function findProductIdsOrder(&$objQuery, $arrVal = array()) {
  75.         $table = <<< __EOS__
  76.                  dtb_products AS alldtl
  77.             JOIN dtb_products_class AS T1
  78.               ON alldtl.product_id = T1.product_id
  79.             JOIN dtb_product_categories AS T2
  80.               ON alldtl.product_id = T2.product_id
  81.             JOIN dtb_category
  82.               ON T2.category_id = dtb_category.category_id
  83. __EOS__;
  84.         $objQuery->setGroupBy('alldtl.product_id');
  85.         if(is_array($this->arrOrderData) and $objQuery->order == ""){
  86.             $o_col = $this->arrOrderData['col'];
  87.             $o_table = $this->arrOrderData['table'];
  88.             $o_order = $this->arrOrderData['order'];
  89.             $order = <<< __EOS__
  90.                     (
  91.                         SELECT $o_col
  92.                         FROM
  93.                             $o_table as T2
  94.                         WHERE T2.product_id = alldtl.product_id
  95.                         ORDER BY T2.$o_col $o_order
  96.                         LIMIT 1
  97.                     ) $o_order, product_id
  98. __EOS__;
  99.             $objQuery->setOrder($order);
  100.         }
  101.         $results = $objQuery->select('alldtl.product_id', $table, "", $arrVal,
  102.                                      MDB2_FETCHMODE_ORDERED);
  103.         foreach ($results as $val) {
  104.             $resultValues[] = $val[0];
  105.         }
  106.         return $resultValues;
  107.     }
  108.  
  109.     /**
  110.      * SC_Queryインスタンスに設定された検索条件をもとに対象商品数を取得する.
  111.      *
  112.      * 検索条件は, SC_Query::setWhere() 関数で設定しておく必要があります.
  113.      *
  114.      * @param SC_Query $objQuery SC_Query インスタンス
  115.      * @param array $arrVal 検索パラメーターの配列
  116.      * @return array 対象商品ID数
  117.      */
  118.     function findProductCount(&$objQuery, $arrVal = array()) {
  119.         $table = <<< __EOS__
  120.                  dtb_products AS alldtl
  121.             JOIN dtb_product_categories AS T2
  122.               ON alldtl.product_id = T2.product_id
  123.             JOIN dtb_category
  124.               ON T2.category_id = dtb_category.category_id
  125. __EOS__;
  126.         $objQuery->setGroupBy('alldtl.product_id');
  127.         $sql_base = $objQuery->getSql('alldtl.product_id',$table);
  128.         return $objQuery->getOne( "SELECT count(*) FROM ( $sql_base ) as t" , $arrVal);
  129.     }
  130.  
  131.     /**
  132.      * SC_Queryインスタンスに設定された検索条件をもとに商品一覧の配列を取得する.
  133.      *
  134.      * 主に SC_Product::findProductIds() で取得した商品IDを検索条件にし,
  135.      * SC_Query::setOrder() や SC_Query::setLimitOffset() を設定して, 商品一覧
  136.      * の配列を取得する.
  137.      *
  138.      * @param SC_Query $objQuery SC_Query インスタンス
  139.      * @return array 商品一覧の配列
  140.      */
  141.     function lists(&$objQuery) {
  142.         $col = <<< __EOS__
  143.              product_id
  144.             ,product_code_min
  145.             ,product_code_max
  146.             ,name
  147.             ,comment1
  148.             ,comment2
  149.             ,comment3
  150.             ,main_list_comment
  151.             ,main_image
  152.             ,main_list_image
  153.             ,price01_min
  154.             ,price01_max
  155.             ,price02_min
  156.             ,price02_max
  157.             ,stock_min
  158.             ,stock_max
  159.             ,stock_unlimited_min
  160.             ,stock_unlimited_max
  161.             ,deliv_date_id
  162.             ,status
  163.             ,del_flg
  164.             ,update_date
  165. __EOS__;
  166.         $where = 'dtb_products_class.del_flg = 0';
  167.         $res = $objQuery->select($col, $this->alldtlSQL($where));
  168.         return $res;
  169.     }
  170.  
  171.  
  172.     /**
  173.      * 商品IDを指定し、商品一覧を取得する
  174.      *
  175.      * SC_Query::setOrder() や SC_Query::setLimitOffset() を設定して, 商品一覧
  176.      * の配列を取得する.
  177.      * FIXME: 呼び出し元で設定した、SC_Query::setWhere() も有効に扱いたい。
  178.      *
  179.      * @param SC_Query $objQuery SC_Query インスタンス
  180.      * @param array|int$arrProductId 商品ID
  181.      * @return array 商品一覧の配列
  182.      */
  183.     function getListByProductIds(&$objQuery, $arrProductId = array()) {
  184.         if (empty($arrProductId)) {
  185.             return array();
  186.         }
  187.  
  188.         $where = 'alldtl.product_id IN (' . implode(',', array_fill(0, count($arrProductId), '?')) . ')';
  189.         $where .= ' AND alldtl.del_flg = 0';
  190.  
  191.         $objQuery->setWhere($where, $arrProductId);
  192.         $arrRet = $this->lists($objQuery);
  193.         return $arrRet;
  194.     }
  195.  
  196.     /**
  197.      * 商品詳細を取得する.
  198.      *
  199.      * @param integer $productId 商品ID
  200.      * @return array 商品詳細情報の配列
  201.      */
  202.     function getDetail($productId) {
  203.         $objQuery =& SC_Query_Ex::getSingletonInstance();
  204.         $result = $objQuery->select("*", $this->alldtlSQL("product_id = ? AND del_flg = 0"),
  205.                                     "product_id = ?",
  206.                                     array($productId, $productId));
  207.         return $result[0];
  208.     }
  209.  
  210.     /**
  211.      * 商品詳細情報と商品規格を取得する.
  212.      *
  213.      * @param integer $productClassId 商品規格ID
  214.      * @return array 商品詳細情報と商品規格の配列
  215.      */
  216.     function getDetailAndProductsClass($productClassId) {
  217.         $result = $this->getProductsClass($productClassId);
  218.         $result = array_merge($result, $this->getDetail($result['product_id']));
  219.         return $result;
  220.     }
  221.  
  222.     /**
  223.      * 商品IDに紐づく商品規格を自分自身に設定する.
  224.      *
  225.      * 引数の商品IDの配列に紐づく商品規格を取得し, 自分自身のフィールドに
  226.      * 設定する.
  227.      *
  228.      * @param array $arrProductId 商品ID の配列
  229.      * @param boolean $has_deleted 削除された商品規格も含む場合 true; 初期値 false
  230.      * @return void 
  231.      */
  232.     function setProductsClassByProductIds($arrProductId, $has_deleted = false) {
  233.  
  234.         $arrProductsClass = array();
  235.         foreach ($arrProductId as $productId) {
  236.             $arrProductClass = $this->getProductsClassFullByProductId($productId, $has_deleted);
  237.  
  238.             $classCats1 = array();
  239.             $classCats1['__unselected'] = '選択してください';
  240.  
  241.             // 規格1クラス名
  242.             $this->className1[$productId] =
  243.                 isset($arrProductClass[0]['class_name1'])
  244.                 ? $arrProductClass[0]['class_name1']
  245.                 : '';
  246.  
  247.             // 規格2クラス名
  248.             $this->className2[$productId] =
  249.                 isset($arrProductClass[0]['class_name2'])
  250.                 ? $arrProductClass[0]['class_name2']
  251.                 : '';
  252.  
  253.             // 規格1が設定されている
  254.             $this->classCat1_find[$productId] = (!SC_Utils_Ex::isBlank($arrProductClass[0]['classcategory_id1']));
  255.             // 規格2が設定されている
  256.             $this->classCat2_find[$productId] = (!SC_Utils_Ex::isBlank($arrProductClass[0]['classcategory_id2']));
  257.  
  258.             $this->stock_find[$productId] = false;
  259.             $classCategories = array();
  260.             $classCategories['__unselected']['__unselected']['name'] = '選択してください';
  261.             $classCategories['__unselected']['__unselected']['product_class_id'] = $arrProductClass[0]['product_class_id'];
  262.             // 商品種別
  263.             $classCategories['__unselected']['__unselected']['product_type'] = $arrProductClass[0]['product_type_id'];
  264.             $this->product_class_id[$productId] = $arrProductClass[0]['product_class_id'];
  265.             // 商品種別
  266.             $this->product_type[$productId] = $arrProductClass[0]['product_type_id'];
  267.             foreach ($arrProductClass as $productsClass) {
  268.                 $classCats2 = array();
  269.                 $productsClass1 = $productsClass['classcategory_id1'];
  270.                 $productsClass2 = $productsClass['classcategory_id2'];
  271.                 // 在庫
  272.                 $stock_find_class = ($productsClass['stock_unlimited'] || $productsClass['stock'] > 0);
  273.  
  274.                 $classCats2['classcategory_id2'] = $productsClass2;
  275.                 $classCats2['name'] = $productsClass['classcategory_name2'] . ($stock_find_class ? '' : ' (品切れ中)');
  276.  
  277.                 $classCats2['stock_find'] = $stock_find_class;
  278.  
  279.                 if ($stock_find_class) {
  280.                     $this->stock_find[$productId] = true;
  281.                 }
  282.  
  283.                 if (!in_array($classcat_id1, $classCats1)) {
  284.                     $classCats1[$productsClass1] = $productsClass['classcategory_name1']
  285.                         . ($productsClass2 == 0 && !$stock_find_class ? ' (品切れ中)' : '');
  286.                 }
  287.  
  288.                 // 価格
  289.                 $classCats2['price01']
  290.                     = strlen($productsClass['price01'])
  291.                     ? number_format(SC_Helper_DB_Ex::sfCalcIncTax($productsClass['price01']))
  292.                     : '';
  293.  
  294.                 $classCats2['price02']
  295.                     = strlen($productsClass['price02'])
  296.                     ? number_format(SC_Helper_DB_Ex::sfCalcIncTax($productsClass['price02']))
  297.                     : '';
  298.  
  299.                 // ポイント
  300.                 $classCats2['point']
  301.                     = number_format(SC_Utils_Ex::sfPrePoint($productsClass['price02'], $productsClass['point_rate']));
  302.  
  303.                 // 商品コード
  304.                 $classCats2['product_code'] = $productsClass['product_code'];
  305.                 // 商品規格ID
  306.                 $classCats2['product_class_id'] = $productsClass['product_class_id'];
  307.                 // 商品種別
  308.                 $classCats2['product_type'] = $productsClass['product_type_id'];
  309.  
  310.                 // #929(GC8 規格のプルダウン順序表示不具合)対応のため、2次キーは「#」を前置
  311.                 if (SC_Utils_Ex::isBlank($productsClass1)) {
  312.                     $productsClass1 = '__unselected2';
  313.                 }
  314.                 $classCategories[$productsClass1]['#'] = array(
  315.                     'classcategory_id2' => '',
  316.                     'name' => '選択してください',
  317.                 );
  318.                 $classCategories[$productsClass1]['#' . $productsClass2] = $classCats2;
  319.             }
  320.  
  321.             $this->classCategories[$productId] = $classCategories;
  322.  
  323.             // 規格1
  324.             $this->classCats1[$productId] = $classCats1;
  325.         }
  326.     }
  327.  
  328.     /**
  329.      * SC_Query インスタンスに設定された検索条件を使用して商品規格を取得する.
  330.      *
  331.      * @param SC_Query $objQuery SC_Queryインスタンス
  332.      * @param array $params 検索パラメーターの配列
  333.      * @return array 商品規格の配列
  334.      */
  335.     function getProductsClassByQuery(&$objQuery, $params) {
  336.         // 末端の規格を取得
  337.         $col = <<< __EOS__
  338.             T1.product_id,
  339.             T1.stock,
  340.             T1.stock_unlimited,
  341.             T1.sale_limit,
  342.             T1.price01,
  343.             T1.price02,
  344.             T1.point_rate,
  345.             T1.product_code,
  346.             T1.product_class_id,
  347.             T1.del_flg,
  348.             T1.product_type_id,
  349.             T1.down_filename,
  350.             T1.down_realfilename,
  351.             T2.class_combination_id,
  352.             T2.parent_class_combination_id,
  353.             T2.classcategory_id,
  354.             T2.level,
  355.             T3.name AS classcategory_name,
  356.             T3.rank,
  357.             T4.name AS class_name,
  358.             T4.class_id
  359. __EOS__;
  360.         $table = <<< __EOS__
  361.                       dtb_products_class T1
  362.             LEFT JOIN dtb_class_combination T2
  363.                    ON T1.class_combination_id = T2.class_combination_id
  364.             LEFT JOIN dtb_classcategory T3
  365.                    ON T2.classcategory_id = T3.classcategory_id
  366.             LEFT JOIN dtb_class T4
  367.                    ON T3.class_id = T4.class_id
  368. __EOS__;
  369.  
  370.         $objQuery->setOrder('T3.rank DESC'); // XXX
  371.         $arrRet = $objQuery->select($col, $table, "", $params);
  372.         $levels = array();
  373.         $parents = array();
  374.         foreach ($arrRet as $rows) {
  375.             $levels[] = $rows['level'];
  376.             $parents[] = $rows['parent_class_combination_id'];
  377.         }
  378.         $level = max($levels);
  379.         $parentsClass = array();
  380.         // 階層分の親を取得
  381.         for ($i = 0; $i < $level -1; $i++) {
  382.             $objQuery =& SC_Query_Ex::getSingletonInstance();
  383.             $objQuery->setWhere('T1.class_combination_id IN (' . implode(', ', array_pad(array(), count($parents), '?')) . ')');
  384.  
  385.             $col = <<< __EOS__
  386.                 T1.class_combination_id,
  387.                 T1.classcategory_id,
  388.                 T1.parent_class_combination_id,
  389.                 T1.level,
  390.                 T2.name AS classcategory_name,
  391.                 T2.rank,
  392.                 T3.name AS class_name,
  393.                 T3.class_id
  394. __EOS__;
  395.             $table = <<< __EOS__
  396.                           dtb_class_combination T1
  397.                 LEFT JOIN dtb_classcategory T2
  398.                        ON T1.classcategory_id = T2.classcategory_id
  399.                 LEFT JOIN dtb_class T3
  400.                        ON T2.class_id = T3.class_id
  401. __EOS__;
  402.  
  403.             $objQuery->setOrder('T2.rank DESC'); // XXX
  404.             $arrParents = $objQuery->select($col, $table, "", $parents);
  405.  
  406.             foreach ($arrParents as $rows) {
  407.                 $parents[] = $rows['parent_class_combination_id'];
  408.  
  409.                 foreach ($arrRet as $child) {
  410.                     if ($child['parent_class_combination_id']
  411.                         == $rows['class_combination_id']) {
  412.                         $rows['product_id'] = $child['product_id'];
  413.                     }
  414.                 }
  415.                 $tmpParents[] = $rows;
  416.             }
  417.             $parentsClass = array_merge($parentsClass, $tmpParents);
  418.         }
  419.  
  420.         // 末端から枝を作成
  421.         $tmpClass = array_merge($arrRet, $parentsClass);
  422.  
  423.         foreach ($tmpClass as $val) {
  424.             $val['class_id' . $val['level']] = $val['class_id'];
  425.             $val['class_name' . $val['level']] = $val['class_name'];
  426.             $val['classcategory_name' . $val['level']] = $val['classcategory_name'];
  427.             $val['classcategory_id' . $val['level']] = $val['classcategory_id'];
  428.             $arrProductsClass[] = $val;
  429.         }
  430.         return $arrProductsClass;
  431.     }
  432.  
  433.     /**
  434.      * 商品規格IDから商品規格を取得する.
  435.      *
  436.      * 削除された商品規格は取得しない.
  437.      *
  438.      * @param integer $productClassId 商品規格ID
  439.      * @return array 商品規格の配列
  440.      */
  441.     function getProductsClass($productClassId) {
  442.         $objQuery =& SC_Query_Ex::getSingletonInstance();
  443.         $objQuery->setWhere('product_class_id = ? AND T1.del_flg = 0');
  444.         $objQuery->setOrder("T2.level DESC");
  445.         $results = $this->getProductsClassByQuery($objQuery, $productClassId);
  446.         $productsClass = $this->getProductsClassFull($results);
  447.         return $productsClass[0];
  448.     }
  449.  
  450.     /**
  451.      * 複数の商品IDに紐づいた, 商品規格を取得する.
  452.      *
  453.      * @param array $productIds 商品IDの配列
  454.      * @param boolean $has_deleted 削除された商品規格も含む場合 true; 初期値 false
  455.      * @return array 商品規格の配列
  456.      */
  457.     function getProductsClassByProductIds($productIds = array(), $has_deleted = false) {
  458.         if (empty($productIds)) {
  459.             return array();
  460.         }
  461.         $objQuery =& SC_Query_Ex::getSingletonInstance();
  462.         $where = 'product_id IN (' . implode(', ', array_pad(array(), count($productIds), '?')) . ')';
  463.         if (!$has_deleted) {
  464.             $where .= ' AND T1.del_flg = 0';
  465.         }
  466.         $objQuery->setWhere($where);
  467.         $objQuery->setOrder("T2.level DESC");
  468.         return $this->getProductsClassByQuery($objQuery, $productIds);
  469.     }
  470.  
  471.     /**
  472.      * 商品IDに紐づいた, 商品規格を階層ごとに取得する.
  473.      *
  474.      * @param array $productId 商品ID
  475.      * @return array 階層ごとの商品規格の配列
  476.      */
  477.     function getProductsClassLevelByProductId($productId) {
  478.         $results = $this->getProductsClassByProductIds(array($productId));
  479.         return $this->getProductsClassLevel($results);
  480.     }
  481.  
  482.     /**
  483.      * 商品IDに紐づいた, 商品規格をすべての組み合わせごとに取得する.
  484.      *
  485.      * @param array $productId 商品ID
  486.      * @param boolean $has_deleted 削除された商品規格も含む場合 true; 初期値 false
  487.      * @return array すべての組み合わせの商品規格の配列
  488.      */
  489.     function getProductsClassFullByProductId($productId, $has_deleted = false) {
  490.         $results = $this->getProductsClassByProductIds(array($productId), $has_deleted);
  491.         return $this->getProductsClassFull($results);
  492.     }
  493.  
  494.     /**
  495.      * 商品規格の配列から, 商品規格を階層ごとに取得する.
  496.      *
  497.      * @access private
  498.      * @param array $productsClassResults 商品規格の結果の配列
  499.      * @return array 階層ごとの商品規格の配列
  500.      */
  501.     function getProductsClassLevel($productsClassResults) {
  502.         foreach ($productsClassResults as $row) {
  503.             $productsClassLevel['level' . $row['level']][] = $row;
  504.         }
  505.         return $productsClassLevel;
  506.     }
  507.  
  508.     /**
  509.      * 商品規格の配列から, 商品規格のすべての組み合わせを取得する.
  510.      *
  511.      * @access private
  512.      * @param array $productsClassResults 商品規格の結果の配列
  513.      *  @ array 階層ごとの商品規格の配列
  514.      */
  515.     function getProductsClassFull($productsClassResults) {
  516.         $results = $this->getProductsClassLevel($productsClassResults);
  517.         $productsClass = array();
  518.         if (SC_Utils_Ex::isBlank($results["level1"])
  519.             && SC_Utils_Ex::isBlank($results["level2"])) {
  520.             return $results['level'];
  521.         }
  522.  
  523.         foreach ($results["level1"] as $level1) {
  524.             foreach ($results["level2"] as $level2) {
  525.                 if ($level2['parent_class_combination_id'] == $level1['class_combination_id']) {
  526.                     $level1 = array_merge($level1, $level2);
  527.                 }
  528.             }
  529.             $productsClass[] = $level1;
  530.         }
  531.         return $productsClass;
  532.     }
  533.  
  534.     /**
  535.      * 商品IDをキーにした, 商品ステータスIDの配列を取得する.
  536.      *
  537.      * @param array 商品ID の配列
  538.      * @return array 商品IDをキーにした商品ステータスIDの配列
  539.      */
  540.     function getProductStatus($productIds) {
  541.         if (empty($productIds)) {
  542.             return array();
  543.         }
  544.         $objQuery =& SC_Query_Ex::getSingletonInstance();
  545.         $cols = 'product_id, product_status_id';
  546.         $from = 'dtb_product_status';
  547.         $where = 'del_flg = 0 AND product_id IN (' . implode(', ', array_pad(array(), count($productIds), '?')) . ')';
  548.         $productStatus = $objQuery->select($cols, $from, $where, $productIds);
  549.         $results = array();
  550.         foreach ($productStatus as $status) {
  551.             $results[$status['product_id']][] = $status['product_status_id'];
  552.         }
  553.         return $results;
  554.     }
  555.  
  556.     /**
  557.      * 商品ステータスを設定する.
  558.      *
  559.      * TODO 現在は DELETE/INSERT だが, UPDATE を検討する.
  560.      *
  561.      * @param integer $productId 商品ID
  562.      * @param array $productStatusIds ON にする商品ステータスIDの配列
  563.      */
  564.     function setProductStatus($productId, $productStatusIds) {
  565.  
  566.         $val['product_id'] = $productId;
  567.         $val['creator_id'] = $_SESSION['member_id'];
  568.         $val['create_date'] = 'CURRENT_TIMESTAMP';
  569.         $val['update_date'] = 'CURRENT_TIMESTAMP';
  570.         $val['del_flg'] = '0';
  571.  
  572.         $objQuery =& SC_Query_Ex::getSingletonInstance();
  573.         $objQuery->delete('dtb_product_status', 'product_id = ?', array($productId));
  574.         foreach ($productStatusIds as $productStatusId) {
  575.             if($productStatusId == '') continue;
  576.             $val['product_status_id'] = $productStatusId;
  577.             $objQuery->insert('dtb_product_status', $val);
  578.         }
  579.     }
  580.  
  581.     /**
  582.      * 商品詳細の結果から, 購入制限数を取得する.
  583.      *
  584.      * getDetailAndProductsClass() の結果から, 購入制限数を取得する.
  585.      *
  586.      * @param array $p 商品詳細の検索結果の配列
  587.      * @return integer 商品詳細の結果から求めた購入制限数.
  588.      * @see getDetailAndProductsClass()
  589.      */
  590.     function getBuyLimit($p) {
  591.         $limit = null;
  592.         if ($p['stock_unlimited'] != '1' && is_numeric($p['sale_limit'])) {
  593.             $limit = min($p['sale_limit'], $p['stock']);
  594.         } elseif (is_numeric($p['sale_limit'])) {
  595.             $limit = $p['sale_limit'];
  596.         } elseif ($p['stock_unlimited'] != '1') {
  597.             $limit = $p['stock'];
  598.         }
  599.         return $limit;
  600.     }
  601.  
  602.     /**
  603.      * 在庫を減少させる.
  604.      *
  605.      * 指定の在庫数まで, 在庫を減少させる.
  606.      * 減少させた結果, 在庫数が 0 未満になった場合, 引数 $quantity が 0 の場合は,
  607.      * 在庫の減少を中止し, false を返す.
  608.      * 在庫の減少に成功した場合は true を返す.
  609.      *
  610.      * @param integer $productClassId 商品規格ID
  611.      * @param integer $quantity 減少させる在庫数
  612.      * @return boolean 在庫の減少に成功した場合 true; 失敗した場合 false
  613.      */
  614.     function reduceStock($productClassId, $quantity) {
  615.  
  616.         if ($quantity == 0) {
  617.             return false;
  618.         }
  619.  
  620.         $objQuery =& SC_Query_Ex::getSingletonInstance();
  621.         $objQuery->update('dtb_products_class', array(),
  622.                           "product_class_id = ?", array($productClassId),
  623.                           array('stock' => 'stock - ?'), array($quantity));
  624.         // TODO エラーハンドリング
  625.  
  626.         $productsClass = $this->getDetailAndProductsClass($productClassId);
  627.         if ($productsClass['stock_unlimited'] != '1' && $productsClass['stock'] < 0) {
  628.             return false;
  629.         }
  630.  
  631.         return true;
  632.     }
  633.  
  634.     /**
  635.      * 商品情報の配列に, 税込金額を設定して返す.
  636.      *
  637.      * この関数は, 主にスマートフォンで使用します.
  638.      *
  639.      * @param array $arrProducts 商品情報の配列
  640.      * @return array 税込金額を設定した商品情報の配列
  641.      */
  642.     function setPriceTaxTo($arrProducts) {
  643.         foreach ($arrProducts as $key=>$val) {
  644.             $arrProducts[$key]['price01_min_format'] = number_format($arrProducts[$key]['price01_min']);
  645.             $arrProducts[$key]['price01_max_format'] = number_format($arrProducts[$key]['price01_max']);
  646.             $arrProducts[$key]['price02_min_format'] = number_format($arrProducts[$key]['price02_min']);
  647.             $arrProducts[$key]['price02_max_format'] = number_format($arrProducts[$key]['price02_max']);
  648.  
  649.             $arrProducts[$key]['price01_min_tax'] = SC_Helper_DB::sfCalcIncTax($arrProducts[$key]['price01_min']);
  650.             $arrProducts[$key]['price01_max_tax'] = SC_Helper_DB::sfCalcIncTax($arrProducts[$key]['price01_max']);
  651.             $arrProducts[$key]['price02_min_tax'] = SC_Helper_DB::sfCalcIncTax($arrProducts[$key]['price02_min']);
  652.             $arrProducts[$key]['price02_max_tax'] = SC_Helper_DB::sfCalcIncTax($arrProducts[$key]['price02_max']);
  653.  
  654.             $arrProducts[$key]['price01_min_tax_format'] = number_format($arrProducts[$key]['price01_min_tax']);
  655.             $arrProducts[$key]['price01_max_tax_format'] = number_format($arrProducts[$key]['price01_max_tax']);
  656.             $arrProducts[$key]['price02_min_tax_format'] = number_format($arrProducts[$key]['price02_min_tax']);
  657.             $arrProducts[$key]['price02_max_tax_format'] = number_format($arrProducts[$key]['price02_max_tax']);
  658.         }
  659.         return $arrProducts;
  660.     }
  661.  
  662.     /**
  663.      * 商品詳細の SQL を取得する.
  664.      *
  665.      * @param string $where 商品詳細の WHERE 句
  666.      * @return string 商品詳細の SQL
  667.      */
  668.     function alldtlSQL($where = "") {
  669.         $where_clause = "";
  670.         if (!SC_Utils_Ex::isBlank($where)) {
  671.             $where_clause = " WHERE " . $where;
  672.         }
  673.         /*
  674.          * point_rate, deliv_fee は商品規格(dtb_products_class)ごとに保持しているが,
  675.          * 商品(dtb_products)ごとの設定なので MAX のみを取得する.
  676.          */
  677.         $sql = <<< __EOS__
  678.             (
  679.                 SELECT 0
  680.                     ,dtb_products.product_id
  681.                     ,dtb_products.name
  682.                     ,dtb_products.maker_id
  683.                     ,dtb_products.status
  684.                     ,dtb_products.comment1
  685.                     ,dtb_products.comment2
  686.                     ,dtb_products.comment3
  687.                     ,dtb_products.comment4
  688.                     ,dtb_products.comment5
  689.                     ,dtb_products.comment6
  690.                     ,dtb_products.note
  691.                     ,dtb_products.main_list_comment
  692.                     ,dtb_products.main_list_image
  693.                     ,dtb_products.main_comment
  694.                     ,dtb_products.main_image
  695.                     ,dtb_products.main_large_image
  696.                     ,dtb_products.sub_title1
  697.                     ,dtb_products.sub_comment1
  698.                     ,dtb_products.sub_image1
  699.                     ,dtb_products.sub_large_image1
  700.                     ,dtb_products.sub_title2
  701.                     ,dtb_products.sub_comment2
  702.                     ,dtb_products.sub_image2
  703.                     ,dtb_products.sub_large_image2
  704.                     ,dtb_products.sub_title3
  705.                     ,dtb_products.sub_comment3
  706.                     ,dtb_products.sub_image3
  707.                     ,dtb_products.sub_large_image3
  708.                     ,dtb_products.sub_title4
  709.                     ,dtb_products.sub_comment4
  710.                     ,dtb_products.sub_image4
  711.                     ,dtb_products.sub_large_image4
  712.                     ,dtb_products.sub_title5
  713.                     ,dtb_products.sub_comment5
  714.                     ,dtb_products.sub_image5
  715.                     ,dtb_products.sub_large_image5
  716.                     ,dtb_products.sub_title6
  717.                     ,dtb_products.sub_comment6
  718.                     ,dtb_products.sub_image6
  719.                     ,dtb_products.sub_large_image6
  720.                     ,dtb_products.del_flg
  721.                     ,dtb_products.creator_id
  722.                     ,dtb_products.create_date
  723.                     ,dtb_products.update_date
  724.                     ,dtb_products.deliv_date_id
  725.                     ,T4.product_code_min
  726.                     ,T4.product_code_max
  727.                     ,T4.price01_min
  728.                     ,T4.price01_max
  729.                     ,T4.price02_min
  730.                     ,T4.price02_max
  731.                     ,T4.stock_min
  732.                     ,T4.stock_max
  733.                     ,T4.stock_unlimited_min
  734.                     ,T4.stock_unlimited_max
  735.                     ,T4.point_rate
  736.                     ,T4.deliv_fee
  737.                     ,T4.class_count
  738.                     ,dtb_maker.name AS maker_name
  739.                 FROM dtb_products
  740.                     JOIN (
  741.                        SELECT product_id,
  742.                               MIN(product_code) AS product_code_min,
  743.                               MAX(product_code) AS product_code_max,
  744.                               MIN(price01) AS price01_min,
  745.                               MAX(price01) AS price01_max,
  746.                               MIN(price02) AS price02_min,
  747.                               MAX(price02) AS price02_max,
  748.                               MIN(stock) AS stock_min,
  749.                               MAX(stock) AS stock_max,
  750.                               MIN(stock_unlimited) AS stock_unlimited_min,
  751.                               MAX(stock_unlimited) AS stock_unlimited_max,
  752.                               MAX(point_rate) AS point_rate,
  753.                               MAX(deliv_fee) AS deliv_fee,
  754.                               COUNT(*) as class_count
  755.                         FROM dtb_products_class
  756.                         $where_clause
  757.                         GROUP BY product_id
  758.                     ) AS T4
  759.                         ON dtb_products.product_id = T4.product_id
  760.                     LEFT JOIN dtb_maker
  761.                         ON dtb_products.maker_id = dtb_maker.maker_id
  762.             ) AS alldtl
  763. __EOS__;
  764.         return $sql;
  765.     }
  766.  
  767.     /**
  768.      * 商品規格詳細の SQL を取得する.
  769.      *
  770.      * MEMO: 2.4系 vw_product_classに相当(?)するイメージ
  771.      *
  772.      * @param string $where 商品詳細の WHERE 句
  773.      * @return string 商品規格詳細の SQL
  774.      */
  775.     function prdclsSQL($where = "") {
  776.         $where_clause = "";
  777.         if (!SC_Utils_Ex::isBlank($where)) {
  778.             $where_clause = " WHERE " . $where;
  779.         }
  780.         $sql = <<< __EOS__
  781.         (
  782.              SELECT dtb_products.*,
  783.                     dtb_products_class.product_class_id,
  784.                     dtb_products_class.class_combination_id,
  785.                     dtb_products_class.product_type_id,
  786.                     dtb_products_class.product_code,
  787.                     dtb_products_class.stock,
  788.                     dtb_products_class.stock_unlimited,
  789.                     dtb_products_class.sale_limit,
  790.                     dtb_products_class.price01,
  791.                     dtb_products_class.price02,
  792.                     dtb_products_class.deliv_fee,
  793.                     dtb_products_class.point_rate,
  794.                     dtb_products_class.down_filename,
  795.                     dtb_products_class.down_realfilename,
  796.                     dtb_class_combination.parent_class_combination_id,
  797.                     dtb_class_combination.classcategory_id,
  798.                     dtb_class_combination.level as classlevel,
  799.                     Tpcm.classcategory_id as parent_classcategory_id,
  800.                     Tpcm.level as parent_classlevel,
  801.                     Tcc1.class_id as class_id,
  802.                     Tcc1.name as classcategory_name,
  803.                     Tcc2.class_id as parent_class_id,
  804.                     Tcc2.name as parent_classcategory_name
  805.              FROM dtb_products
  806.                  LEFT JOIN dtb_products_class
  807.                      ON dtb_products.product_id = dtb_products_class.product_id
  808.                  LEFT JOIN dtb_class_combination
  809.                      ON dtb_products_class.class_combination_id = dtb_class_combination.class_combination_id
  810.                  LEFT JOIN dtb_class_combination as Tpcm
  811.                      ON dtb_class_combination.parent_class_combination_id = Tpcm.class_combination_id
  812.                  LEFT JOIN dtb_classcategory as Tcc1
  813.                      ON dtb_class_combination.classcategory_id = Tcc1.classcategory_id
  814.                  LEFT JOIN dtb_classcategory as Tcc2
  815.                      ON Tpcm.classcategory_id = Tcc2.classcategory_id
  816.              $where_clause
  817.         ) as prdcls
  818. __EOS__;
  819.         return $sql;
  820.     }
  821.  
  822.     /**
  823.      * 商品規格ID1、2に紐づいた,product_class_idを取得する.
  824.      *
  825.      * @param int $productId 商品ID
  826.      * @param int $classcategory_id1 商品規格ID1
  827.      * @param int $classcategory_id2 商品規格ID2
  828.      * @return string product_class_id
  829.      */
  830.     function getClasscategoryIdsByProductClassId($productId, $classcategory_id1, $classcategory_id2) {
  831.         $objQuery = new SC_Query_Ex();
  832.         $col = "T1.product_id AS product_id,T1.product_class_id AS product_class_id,T1.classcategory_id1 AS classcategory_id1,T1.classcategory_id2 AS classcategory_id2";
  833.         $table = <<< __EOS__
  834.             (SELECT
  835.                 pc.product_code AS product_code,
  836.                 pc.product_id AS product_id,
  837.                 pc.product_class_id AS product_class_id,
  838.                 pc.class_combination_id AS class_combination_id,
  839.                 COALESCE(cc2.classcategory_id,0) AS classcategory_id1,
  840.                 COALESCE(cc1.classcategory_id,0) AS classcategory_id2
  841.             FROM
  842.                 dtb_products_class pc LEFT JOIN dtb_class_combination cc1 ON pc.class_combination_id = cc1.class_combination_id
  843.                 LEFT JOIN dtb_class_combination cc2 ON cc1.parent_class_combination_id = cc2.class_combination_id) T1
  844. __EOS__;
  845.         $where = "T1.product_id = ? AND T1.classcategory_id1 = ? AND T1.classcategory_id2 = ?";
  846.         $arrRet = $objQuery->select($col, $table, $where,
  847.                                     array($productId, $classcategory_id1, $classcategory_id2));
  848.         return $arrRet[0]['product_class_id'];
  849.     }
  850.  
  851. }
  852. ?>

Documentation generated on Fri, 24 Feb 2012 14:02:53 +0900 by Seasoft